package cn.basic.social.api.weixintalk;

import cn.basic.social.api.BaseRequest;
import cn.basic.social.api.exception.ApiRuleException;

import java.io.File;
import java.util.Map;

/**
 * @ClassName WxRequest
 * @Description 微信基础请求接口
 * @Author zlf
 * @Date 2023/8/25 10:09
 */
public interface WxRequest<T extends WxResponse> extends BaseRequest {

    /**
     * 获取请求接口API地址
     *
     * @param
     * @return
     * @author zlf
     * @date 10:13 2023/8/25
     */
    public String getRequestUrl();

    /**
     * 获取Http method，例如GET,POST
     * 
     * @param 
     * @return 
     * @author zlf
     * @date 10:13 2023/8/25
     */
    public String getTopHttpMethod();

    /**
     * 设置Http method，例如GET,POST
     * 
     * @param topHttpMethod 例如GET,POST
     * @return 
     * @author zlf
     * @date 10:14 2023/8/25
     */
    public void setTopHttpMethod(String topHttpMethod);

    /**
     * 获取所有的Key-Value形式的文本请求参数集合。其中：
     * Key: 请求参数名
     * Value: 请求参数值
     *
     * @return 文本请求参数集合
     * @author zlf
     * @date 10:15 2023/8/25
     */
    public Map<String, String> getTextParams();

    /**
     * 获取具体响应实现类的定义，可以设置请求时要求返回的数据格式
     * 
     * @return
     * @author zlf
     * @date 10:16 2023/8/25
     */
    public Class<T> getResponseClass();

    /**
     * 获取自定义HTTP请求头参数
     * 
     * @return
     * @author zlf
     * @date 10:17 2023/8/25
     */
    public Map<String, String> getHeaderMap();

    /**
     * 客户端参数检查，减少服务端无效调用
     * 
     * @param 
     * @return
     * @author zlf
     * @date 10:17 2023/8/25
     */
    public void check() throws ApiRuleException;

    /**
     * API对应的请求方式，包含xml,json,form
     * 
     * @param 
     * @return 
     * @author zlf
     * @date 14:04 2023/8/25
     */
    public String getTopContentType();

    /**
     * 设置API对应的请求方式，包含xml,json,form
     * 
     * @param topContentType
     * @return 
     * @author zlf
     * @date 14:05 2023/8/25
     */
    public void setTopContentType(String topContentType);

    default File getFile(){
        return null;
    };

    default String getFileType(){
        return "";
    }

    default String getLoginCode() {
        return "";
    }

    /**
     * 由于一些请求需要传递参数，但是又不作为body请求，所以定义这个方法用来传JSON字符串格式的参数，用来透传到该服务
     * 
     * @author zlf
     * @date 9:23 2023/9/6
     */
    default String jsonParamBody(){
        return null;
    }

}
